package com.xzzz.irda.auth.core.token;

import com.xzzz.irda.auth.core.authorization.Authorization;

import java.util.List;

/**
 * 授权对象存储方式
 *
 * @author wangyf
 * 
 */
public interface AuthorizationRepository {

    /* ------------------------------< token 信息 >------------------------------
     * 保存在授权主体中, 不单独保存
     * ----------------------------------------------------------------------- */

    /**
     * 获取 token 信息
     *
     * @param token token token
     * @return token 信息
     */
    AccessToken getAccessToken(String token);

    /* ------------------------------< 授权信息 >--------------------------------
     * 封装 token 和权限
     * ----------------------------------------------------------------------- */

    /**
     * 保存授权信息
     *
     * @param token         授权的 token
     * @param authorization 授权主体
     */
    void saveAuthorization(Authorization authorization);

    /**
     * 获取授权主体
     *
     * @param token 授权key
     * @return 授权主体
     */
    Authorization getAuthorization(String token);

    /**
     * 刷新授权主体
     *
     * @param token         授权主体 token
     * @param authorization 授权主体
     */
    void refreshAuthorization(Authorization authorization);

    /**
     * 删除授权主体
     *
     * @param token 授权主体 token
     */
    void removeAuthorization(String token);


    /* ------------------------------< 权限信息 >--------------------------------
     * 保存在授权主体中, 不单独保存
     * ----------------------------------------------------------------------- */

    /**
     * 设置权限
     *
     * @param key         授权的 key
     * @param permissions 权限集合
     */
    void savePermissions(String key, List<String> permissions);

    /**
     * 获取权限
     *
     * @param key 授权主体保存的key,通常是{@link AccessToken#getToken()}
     * @return 权限集合
     */
    List<String> getPermissions(String key);


    /* ------------------------------< token唯一性保证 >--------------------------
     * 是否允许token在任何地方使用
     * ----------------------------------------------------------------------- */

    /**
     * 设置有效token
     * 默认通过 userid + platform标识
     *
     * @param authorization 授权主体
     */
    void saveUniqueToken(Authorization authorization);

    /**
     * 获取有效token
     * 默认通过 userid + platform标识
     *
     * @param key 授权主体保存的key,通常是{@link AccessToken#getToken()}
     * @return token 有效token
     */
    String getUniqueToken(String key);

    /**
     * 删除有效token
     *
     * @param key 授权主体保存的key,通常是{@link AccessToken#getToken()}
     */
    void removeUniqueToken(String key);

    /**
     * 刷新有效token的过期时间
     *
     * @param authorization 授权主体
     */
    void refreshUniqueToken(Authorization authorization);

}
